# 05 — Dashboards & Run Guide Three dashboards in `~/projects-personal/schwab-options/`, in order of "what I actually use day-to-day": ## `dashboard_visual.py` — the one you want **Two-panel + bar-charts layout matching the SpotGamma/QuantData reference screenshots.** ``` HEADER · symbol tabs (ES NQ RTY GC) · DTE tabs (0DTE 7DTE 30DTE) ───────────────────────────────────────────────────────────────── REGIME BANNER POSITIVE GAMMA (+58 pts above flip) "Dealers are net long gamma — hedging stabilizes..." ───────────────────────────────────────────────────────────────── GEX KEY LEVELS │ GAMMA DASHBOARD (K/V) │ CALL WALLS (RESISTANCE) │ Spot 7,545 7600 -$2.29B 19,336 OI │ Flip Strike 7,488 7580 -$1.99B 13,958 OI │ Spot vs flip +58 pts 7590 ... │ Net GEX -$13.41B │ Call GEX -$18.13B PUT WALLS (SUPPORT) │ Put GEX +$4.72B 7400 $495M 12,427 OI │ Net Delta $ ... 7450 ... │ ATM IV ... │ Max Pain ... ───────────────────────────────────────────────────────────────── Net Delta by Strike │ Net Gamma by Strike │ Net Vanna by Strike (horizontal bars, green/red bipolar by sign) ───────────────────────────────────────────────────────────────── Zero-GEX Zones (cumulative-GEX crossings near spot) ───────────────────────────────────────────────────────────────── Max Pain by Expiration ``` Single-file self-contained HTML. Embedded JSON data + vanilla JS for tab switching + Chart.js from CDN. Symbol+DTE tabs are synced — click any, every panel re-renders. ### Running it ```bash cd ~/projects-personal/schwab-options source ~/.venvs/schwab-options/bin/activate # Latest trading day, default symbols python dashboard_visual.py # Specific date (good for back-testing levels) python dashboard_visual.py --date 2026-05-22 # Auto-open in browser (Linux default browser if running under X) python dashboard_visual.py --open ``` Output: `reports/dashboard_visual_YYYYMMDD_HHMMSS.html`. Open directly or copy to `/mnt/c/Users/dlitt/Downloads/` and double-click. ### Run time and cost - DataBento queries: ~10-15s total (one definition + one statistics per parent; ES alone has 10 parents) - OPRA cost: ~$0.99 per dashboard run (3 symbols × $0.33/day-statistics) - CME cost: $0.00 (included in subscription tier) - Schwab spot lookups: free, no quota issue for 4 quotes ### Symbol coverage in the default UNDERLYINGS list (as of 2026-05-26 EOD) - **ES** → 10 CME parents: `ES.OPT` + `E1A-E1D.OPT` (Mon-Thu weeklies) + `EW1-EW4.OPT` (Friday weeklies) + `EW.OPT` - **NQ** → 9 CME parents: `NQ.OPT` + `Q1A-Q1D.OPT` + `QN1-QN4.OPT` - **RUT** → 2 OPRA parents: `RUT.OPT` + `RUTW.OPT` (cash index; direct match to SG) - **IWM** → 1 Schwab parent (Russell ETF; parallel to RUT for scale-factor study) - **GC** → 1 CME parent: `OG.OPT` (gold smart symbol; no daily expiries) - **SPX** → 2 OPRA parents: `SPX.OPT` + `SPXW.OPT` - **NDX** → 2 OPRA parents: `NDX.OPT` + `NDXP.OPT` - **SPY** → 1 Schwab parent (S&P ETF) - **QQQ** → 1 Schwab parent (Nasdaq ETF) ### View tabs (NEW 2026-05-26) Top of dashboard now has a third tab strip with three view modes: - **Ours** (default) — our computed levels - **SG** — SpotGamma's published levels (CW, PW, VT, ZG, L1-L4, C1-C4, 1d/5d move) for the active symbol; greyed out if no SG data for today - **Compare** — side-by-side `Ours / SG / Δ` table with color-coded delta column Requires today's SG indicator string saved to `~/.schwab/sg-levels-YYYY-MM-DD.txt`. See [[09 - SpotGamma Tracking & Reverse Engineering]]. ### Daily SG input workflow 1. ~8:00 AM ET — open SpotGamma dashboard → "Copy All" button → paste into `~/.schwab/sg-levels-YYYY-MM-DD.txt` 2. Run `python dashboard_visual.py` as usual 3. Dashboard auto-loads SG levels, enables the SG / Compare view tabs, persists comparison line to `reports/level_tracking.jsonl` ## `dashboard_db.py` — terse summary version The earlier-built DataBento dashboard. Shows the same data but as compact summary cards instead of charts + tables. Includes a SPX/NDX/RUT bonus section. Useful when you want a quick overview without scrolling. ```bash python dashboard_db.py --date 2026-05-22 --skip-opra # CME only, free python dashboard_db.py --date 2026-05-22 # full ``` ## `dashboard.py` — ETF-proxy classic Original Schwab-REST-only dashboard. Uses SPY/QQQ/IWM/GLD as proxies for ES/NQ/RTY/GC. Doesn't need DataBento at all. Kept because: - Free to run (Schwab quotes only) - ETF chains have different dealer-positioning dynamics from index/futures — useful comparison signal - Works even if DataBento is down ```bash python dashboard.py # uses today as the trade day python dashboard.py --open ``` ## Reading the dashboard at the open 1. **Look at the regime banner first.** Positive gamma = expect range / mean reversion; negative gamma = expect momentum / trend extension. Bias your entry style accordingly. 2. **Note the flip strike.** A trade through it is a regime change — high-conviction signal. 3. **Scan the top call wall and top put wall.** Those are your channel boundaries for the day. 4. **Check the per-expiration max pain.** On expiration days especially, expect some gravity. 5. **Glance at vanna sign.** If IV is likely to rise (news, vol expansion), positive vanna is supportive, negative is destabilizing — multiplies any directional thesis. 6. **Mind the zero-GEX zones.** Secondary support/resistance levels between the main walls. ## How daily we should run it Once each morning, pre-market, with `--date` as the prior trading day. OI is settled overnight so Friday's OI is the right number for Monday's open. SpotGamma works exactly this way (they publish "AM levels" each pre-open). Optional second run mid-day if you want to refresh the spot-anchored views (walls / flip don't change much intraday — OI is static — but the spot vs flip distance does drift). ## See also - [[00 - Overview]] — the full file map - [[06 - Cost & Budget]] — what running this daily costs - [[07 - Future Work]] — intraday refresh, weeklies for RUT, etc.